define(
		[ 'ng', '_', 'profesor/js/profesor-module', 'ui.router',
				'common/js/util-module', "$" ],
		function(angular, _) {
			var app = angular.module("ProfesorApp",
					[ 'UserModule', 'ProfesorModule', "ui.router", "UtilModule" ]);
								app.value("epGlobals", {});
			app
					.directive(
							"epGraderTable",
							function() {
								return {
									restrict : 'E',
									template : '<table style="table-layout:fixed">'
											+ '<colgroup>'
											+ '<col span="1" style="width: 12.5%;"/>'
											+ '<col span="1" style="width: 37.5%;"/>'
											+ '<col span="1" style="width: 17%;"/>'
											+ '<col span="1" style="width: 17%;"/>'
											+ '<col span="1" style="width: 17%;"/>'

											+ '<col span="1" style="width: 11.5%;"/>'
											+ '</colgroup>'
											+ '<thead>'
											+ '<tr>'
											+ '<th>Cod</th>'
											+ '<th>Nombre</th>'
											+ '<th>Fortalezas</th>'
											+ '<th>Debilidades</th>'
											+ '<th>Recomendaciones</th>'
											+ '<th>Nota</th>'
											+ '</tr>'
											+ '</thead>'
											+ '<tbody>'
											+ '<tr ng-repeat="calificacion in calificaciones" ep-grader calificacion="calificacion"></tr>'
											+ '</tbody>' + '</table>',
									replace : true,
									scope : {
										calificaciones : '='
									},

									controller : function($scope) {
										this.dragging = false;
										this.decoracion = function(index, indicador) {

											if (this.dragging && indicador == this.indicador) {

												return {
													puit : index >= Math.min(this.index, this.toIndex)
															&& index <= Math.max(this.index, this.toIndex)
												};
											}
											return {
												puit : false
											};
										}

										this.startPaste = function(indicador, index) {
											this.dragging = true;
											this.index = index;
											var field;
											switch (indicador) {
											case 1:
												field = 'indicador1';
												break;
											case 2:
												field = 'indicador2';
												break;
											case 3:
												field = 'indicador3';
												break;
											case 4:
												field = 'indicador4';
												break;
											case 5:
												field = 'nota';
												break;
											}
											this.indicador = field;

										}
										this.paste = function() {

											var self = this;
											if (self.dragging)
												$scope
														.$apply(function() {
															var valueToCopy = $scope.calificaciones[self.index][self.indicador];
															var initIndex = Math
																	.min(self.index, self.toIndex);
															var finalIndex = Math.max(self.index,
																	self.toIndex);

															for (i = initIndex; i <= finalIndex; i++) {

																$scope.calificaciones[i][self.indicador] = valueToCopy;
															}
															self.dragging = false;
														});

										}
										this.pasteUntil = function(toIndex) {

											this.toIndex = toIndex;

											if (this.dragging) {
												$scope.$digest();

											}
										}
									}
								};
							});

			angular
					.module("ProfesorApp")
					.directive(
							"epGrader",
							function() {
								return {
									restrict : 'A',
									require : '^epGraderTable',
									template : '<td ng-bind="calificacion.estudiante.codigo"></td>'
											+ '<td><span ng-bind="calificacion.estudiante.apellidos"></span> <span ng-bind="calificacion.estudiante.nombres"></span>'
											+ '</td><td ng-class="decoracion(\'indicador1\')" ep-cell val="calificacion.indicador1"></td>'
											+ '<td ng-class="decoracion(\'indicador2\')" ep-cell val="calificacion.indicador2"></td>'
											+ '<td ng-class="decoracion(\'indicador3\')" ep-cell val="calificacion.indicador3"></td>'
											+ '<td ng-class="decoracion(\'indicador4\')" ep-cell val="calificacion.indicador4"></td>'
											+ '<td ng-class="decoracion(\'nota\')" ep-cell val="calificacion.nota"></td>',

									scope : {
										calificacion : '='

									},
									link : function(scope, element, attributes, ctrl) {

										scope.decoracion = function(b) {

											return ctrl.decoracion(scope.$parent.$index, b);
										}

										element.find('input').keyup(function(e) {
											if (e.which == 40 || e.which == 13) {
												var $i = $(this).closest("td").index();
												element.next().children().eq($i).find("input").focus();
											} else if (e.which == 38) {
												var $i = $(this).closest("td").index();
												element.prev().children().eq($i).find("input").focus();
											}

										});
										element.mouseup(function() {
											ctrl.paste();
										});
										element.mouseenter(function() {
											ctrl.pasteUntil(scope.$parent.$index);
										});
									}
								};
							});
			angular
					.module("ProfesorApp")
					.directive(
							"epCell",
							function() {
								return {
									require : '^epGraderTable',
									restrict : 'A',

									scope : {
										val : '=',
									},
									template : '<div class="con-input"><input class="form-control" type="text" ng-model="val">'
											+ '<button class="btn-arrastrar"><i class="glyphicon glyphicon-resize-vertical"></i></button></div>	',
									link : function(scope, element, attrs, ctrl) {
										element.find("button").mousedown(function() {
											var indicador = element.closest("td").index() - 1;
											var index = scope.$parent.$parent.$index;
											ctrl.startPaste(indicador, index);

										});

									}
								};
							});
			app.directive("epCalificacionPeriodo", function() {
				return {
					restrict : 'E',
					replace: true,
					templateUrl : "/common/templates/ep-calificacion-periodo.html",
					transclude:true,
					scope : {
						epIndicadoresEstudiante : '=',
						epEstudiante : '=',
						epIndicadoresDisponibles : '=',
						epNota : '=',
						epAddIndicador : '&',
						epRemoveIndicador : '&',
						epChangeCalificacion : '&',
					},
					link : function(scope) {
						scope.indicadoresEstudianteMap = {};
						scope.indicadoresDisponibles = [];

						var fixLists = function() {
							scope.indicadoresDisponibles = _.chain(
									scope.epIndicadoresDisponibles).map(function(obj) {
								return _.pick(obj, "categoria", "consecutivo")
							}).reject(
									function(obj) {
										return _.some(scope.epIndicadoresEstudiante, function(ie) {
											return ie.categoria == obj.categoria
													&& ie.consecutivo == obj.consecutivo
										});
									}).value();

						};
						scope.removeIndicador = function(indicador) {
							scope.epRemoveIndicador(indicador);
							// _.remove(scope.epIndicadoresEstudiante, function(indic) {
							// return indic.categoria == indicador.categoria
							// && indic.consecutivo == indicador.consecutivo;
							// })
						}
						scope.$watchCollection("epIndicadoresDisponibles", fixLists);
						scope.$watchCollection("epIndicadoresEstudiante", function() {
							fixLists();
							scope.indicadoresEstudianteMap = _.chain(
									scope.epIndicadoresEstudiante).groupBy('categoria').defaults(
									{
										"Fortalezas" : [],
										"Debilidades" : [],
										"Recomendaciones" : []
									}).value();

						});
						scope.addIndicador = function(indicador) {
							scope.epAddIndicador({
								indicador : indicador
							});

						}
						scope.removeIndicador = function(indicador) {
							scope.epRemoveIndicador({
								indicador : indicador
							});
						}
						scope.changeCalificacion = function(calificacion) {
							scope.epChangeCalificacion({
								calificacion : calificacion
							});
						}
					}
				}
			})

			return app;

		});
